/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.thienloc.omap.controller.report;

import com.thienloc.omap.controller.AbstractCrudBean;
import com.thienloc.omap.entity.TblRawMt;
import com.thienloc.omap.session.RawMoCountFacade;
import com.thienloc.omap.session.TblRawMtFacade;
import com.thienloc.omap.session.TinhThanhFacade;
import com.thienloc.omap.util.Constant;
import com.thienloc.omap.util.JsfUtil;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.apache.commons.io.FileUtils;

/**
 *
 * @author GiangLT
 */
@ManagedBean
@ViewScoped
public class TblRawMtBean extends AbstractCrudBean {

    @EJB
    private TblRawMtFacade facade;
    @EJB
    private TinhThanhFacade tinhThanhFacade;
    @EJB
    private RawMoCountFacade rawMoCountFacade;
    private List<TblRawMt> list = new ArrayList<TblRawMt>();
    private TblRawMt[] selectedList;
    private TblRawMt selected;
    private Map<String, String> shortCodeMap;
//    private Map<String, String> provinceMap;
    private Date startDate;
    private Date endDate;
    private String region;
    private String operator;
    private String content;
    private String moSyntax;
    private List<String> selectedRegions;
    private List<String> selectedShortCodes;
    private List<String> selectedOperators;

    @Override
    protected Logger getLogger() {
        return LoggerFactory.getLogger(TblRawMtBean.class);
    }

    @Override
    protected void resetToCreateFormAction() throws Exception {
        selected = new TblRawMt();
        edit = false;
        view = false;

        shortCodeMap = new TreeMap<String, String>();
        File file = new File(Constant.CONFIG_FOLDER + "shortCodeList.txt");
        List<String> shortCodes = FileUtils.readLines(file);
        for (String shortCode : shortCodes) {
            shortCodeMap.put(shortCode, shortCode);
        }

//        provinceMap = new TreeMap<String, String>();
//        List<TinhThanh> provinces = tinhThanhFacade.findAll();
//        for (TinhThanh tinhThanh : provinces) {
//            provinceMap.put(tinhThanh.getTenTinh() + " - " + tinhThanh.getMaTinh(), tinhThanh.getMaTinh());
//        }
    }

    @Override
    protected void validateForm() throws Exception {
    }

    @Override
    protected void findSelected(int id) throws Exception {
        this.selected = facade.find(id);
    }

    @Override
    protected void createSelected() throws Exception {
        facade.create(selected);
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã thêm mới thành công một bản ghi");
    }

    @Override
    protected void editSelected() throws Exception {
        facade.edit(selected);
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã cập nhật thành công một bản ghi");
    }

    @Override
    protected void removeSelected() throws Exception {
        int size = selectedList.length;
        if (size == 0) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Không có gì để xóa", "Hãy click chọn các bản ghi cần xóa");
            return;
        }
        StringBuilder eventLog = new StringBuilder("Xóa " + size + " MT với id = ");
        for (TblRawMt item : selectedList) {
            facade.remove(item);
            eventLog.append(item.getId());
            eventLog.append(", ");
        }
        eventLog.delete(eventLog.lastIndexOf(", "), eventLog.length());
        search();
        JsfUtil.addSuccessMessage("Thành công!", "Đã xóa thành công " + size + " bản ghi");
    }

    @Override
    protected void prepareViewAction() throws Exception {
        view = true;
        edit = false;
        if (selectedList == null || selectedList.length == 0) {
            JsfUtil.addErrorMessage("Lỗi", "Bạn chưa tích chọn bản ghi cần hiển thị");
            return;
        }
        selected = selectedList[0];
        if (selectedList.length > 1) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Cảnh báo hiển thị", "Bạn đã chọn nhiều hơn 1 bản ghi. Chỉ bản ghi trên cùng được hiển thị");
        }
    }

    @Override
    protected void prepareEditAction() throws Exception {
        view = false;
        edit = true;
        if (selectedList == null || selectedList.length == 0) {
            JsfUtil.addErrorMessage("Lỗi", "Bạn chưa tích chọn bản ghi cần hiển thị");
            return;
        }
        selected = selectedList[0];
        if (selectedList.length > 1) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Cảnh báo hiển thị", "Bạn đã chọn nhiều hơn 1 bản ghi. Chỉ bản ghi trên cùng được hiển thị");
        }
    }

    public void toggleWinLose(TblRawMt item, Short result) {
        try {
            item.setResult(result);
            facade.edit(item);
        } catch (Exception ex) {
            logAndNotifyError(ex);
        }
    }

    public void updateAll() {
        StringBuilder eventLog = new StringBuilder("Sửa " + list.size() + " MT với id = ");
        for (TblRawMt tblRawMt : list) {
            try {
                facade.edit(tblRawMt);
                eventLog.append(tblRawMt.getId()).append(", ");

            } catch (Exception ex) {
                logAndNotifyError(ex);
            }
        }
        JsfUtil.addSuccessMessage("Cập nhật thành công", "Đã cập nhật xong");
        search();
    }

    public void delete(TblRawMt rawMt) {
        try {
            facade.remove(rawMt);
            JsfUtil.addSuccessMessage("Xóa thành công!", "Đã xóa thành công 1 bản ghi");
        } catch (Exception ex) {
            logAndNotifyError(ex);
        }

        search();
    }

    public void search() {
        try {
            List<String> provinces = null;
            if (selectedRegions != null && !selectedRegions.isEmpty()) {
                provinces = tinhThanhFacade.findMaTinhByListVung(selectedRegions);
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(startDate);
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            Date start = cal.getTime();

            cal.setTime(endDate);
            cal.set(Calendar.HOUR_OF_DAY, 23);
            cal.set(Calendar.MINUTE, 59);
            cal.set(Calendar.SECOND, 59);
            Date end = cal.getTime();

            list = facade.find(start, end, selectedShortCodes, provinces, selectedOperators, content, moSyntax);
            for (TblRawMt rawMt : list) {
                String content = rawMt.getGen3();
                if (content != null && !content.isEmpty()) {
                    String[] syntaxes = content.split(",");
                    Long total = 0L;
                    for (String syntax : syntaxes) {
                        Long count = rawMoCountFacade.countByContent(syntax, rawMt.getSc());
                        if (count == null) {
                            count = 0L;
                        }
                        total += count;
                    }
                    rawMt.setCount(total);
                }

            }
        } catch (Exception ex) {
            logAndNotifyError(ex);
        }
    }

    public List<String> getSelectedOperators() {
        return selectedOperators;
    }

    public void setSelectedOperators(List<String> selectedOperators) {
        this.selectedOperators = selectedOperators;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    public Map<String, String> getShortCodeMap() {
        return shortCodeMap;
    }

    public void setShortCodeMap(Map<String, String> shortCodeMap) {
        this.shortCodeMap = shortCodeMap;
    }

    public Date getStartDate() {
        return startDate;
    }

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    public List<TblRawMt> getList() {
        return list;
    }

    public void setList(List<TblRawMt> list) {
        this.list = list;
    }

    public TblRawMt getSelected() {
        return selected;
    }

    public void setSelected(TblRawMt selected) {
        this.selected = selected;
    }

    public TblRawMt[] getSelectedList() {
        return selectedList;
    }

    public void setSelectedList(TblRawMt[] selectedList) {
        this.selectedList = selectedList;
    }

    public List<String> getSelectedRegions() {
        return selectedRegions;
    }

    public void setSelectedRegions(List<String> selectedRegions) {
        this.selectedRegions = selectedRegions;
    }

    public List<String> getSelectedShortCodes() {
        return selectedShortCodes;
    }

    public void setSelectedShortCodes(List<String> selectedShortCodes) {
        this.selectedShortCodes = selectedShortCodes;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getMoSyntax() {
        return moSyntax;
    }

    public void setMoSyntax(String moSyntax) {
        this.moSyntax = moSyntax;
    }
}
